package antlr4.definitive.d4_expr.d4_2_0_labeledExpr.run;

import antlr4.definitive.d4_expr.d4_2_0_labeledExpr.gen.LabeledExprBaseVisitor;
import antlr4.definitive.d4_expr.d4_2_0_labeledExpr.gen.LabeledExprParser;

import java.util.HashMap;

public class EvalVisitor extends LabeledExprBaseVisitor<Integer> {

    HashMap<String, Integer> memory = new HashMap<>();

    @Override
    public Integer visitPrintExpr(LabeledExprParser.PrintExprContext ctx) {
        Integer value = visit(ctx.expr());//计算expr子节点的值
        System.out.println(value); //打印结果
        return 0;//上面已经直接打印出了结果，因此这里返回一个
    }

    /**
     * expr NEWLINE
     */
    @Override
    public Integer visitAssgin(LabeledExprParser.AssginContext ctx) {
        String id = ctx.ID().getText();//id在'="的左侧
        int value = visit(ctx.expr());//计算右侧表达式的值
        memory.put(id, value);//将这个映射关系存储在计算器的“内存”中
        return value;
    }

    @Override
    public Integer visitParens(LabeledExprParser.ParensContext ctx) {
        return visit(ctx.expr());//去掉括号进去一步进行计算
    }

    @Override
    public Integer visitMulDiv(LabeledExprParser.MulDivContext ctx) {
        Integer left = visit(ctx.expr(0));
        Integer right = visit(ctx.expr(1));
        if (ctx.op.getType() == LabeledExprParser.MUL) {
            return left * right;
        } else {
            return left / right;
        }
    }

    @Override
    public Integer visitADDSub(LabeledExprParser.ADDSubContext ctx) {
        Integer left = visit(ctx.expr(0));
        Integer right = visit(ctx.expr(1));
        if (ctx.op.getType() == LabeledExprParser.ADD) {
            return left + right;
        } else {
            return left - right;
        }
    }

    @Override
    public Integer visitId(LabeledExprParser.IdContext ctx) {
        String id = ctx.getText();
        if (memory.containsKey(id)) {
            return memory.get(id);
        }
        return 0;
    }

    @Override
    public Integer visitInt(LabeledExprParser.IntContext ctx) {
        return Integer.parseInt(ctx.getText());
    }

}
